Non-Blocking Socket হলো এমন একটি Socket Mode, যেখানে I/O অপারেশন (যেমন read()
, write()
, বা accept()
) ব্লক না হয়ে অবিলম্বে রিটার্ন করে, এমনকি যদি অপারেশনটি সম্পন্ন না হয়। এটি নেটওয়ার্ক প্রোগ্রামিংয়ে ব্যবহৃত হয়, বিশেষত উচ্চ-পারফরম্যান্স এবং স্কেলেবল সার্ভার ডিজাইন করার জন্য, যেখানে একাধিক Socket-কে একসাথে পরিচালনা করতে হয়।
read()
, write()
, বা accept()
) করা হয়, তখন সেই অপারেশন সম্পন্ন না হওয়া পর্যন্ত Socket অপেক্ষা (ব্লক) করে। এটি একটি সহজ পদ্ধতি, তবে এটি কর্মক্ষমতার জন্য সমস্যাজনক হতে পারে, কারণ অন্য কাজগুলো এই সময়ে স্থগিত থাকে।Non-Blocking Socket সেট করার জন্য সাধারণত Unix/Linux সিস্টেমে fcntl()
ফাংশন ব্যবহার করা হয়। নিচে একটি উদাহরণ দেখানো হলো:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sockfd;
struct sockaddr_in server_addr;
// Socket তৈরি করা
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// Non-Blocking Mode সেট করা
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
// সার্ভারের ঠিকানা সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// Binding করা
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(sockfd);
exit(EXIT_FAILURE);
}
// Listening শুরু করা
listen(sockfd, 5);
printf("Server is running in Non-Blocking mode.\n");
while (1) {
int client_fd = accept(sockfd, NULL, NULL);
if (client_fd < 0) {
perror("No connection yet, will check again later.");
sleep(1); // অন্য কাজ করতে বা অপেক্ষা করতে পারে
} else {
printf("New client connected!\n");
close(client_fd);
}
}
close(sockfd);
return 0;
}
Non-Blocking Sockets সাধারণত Event-Driven Architecture-এর মাধ্যমে ব্যবহৃত হয়। select()
, poll()
, এবং epoll()
-এর মতো ইভেন্ট-ভিত্তিক সিস্টেম কল ব্যবহার করে Socket-এর উপর নজর রাখা হয়, এবং যখন একটি Socket থেকে ডেটা পাঠানোর বা গ্রহণ করার মতো কিছু ঘটে, তখন ইভেন্টটি ট্রিগার হয় এবং সেই অনুযায়ী অ্যাকশন নেওয়া হয়।
common.read_more